package com.seeyon.apps.sphr.kit;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.shuqi.hack.StandardCharsets;
import org.apache.commons.codec.binary.Hex;

import java.math.BigDecimal;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

public class StrKit {

    /**
     * 将Object对象转换为字符串
     *
     * @param o 要转换的Object对象
     * @return 转换后的字符串
     */
    public static String str(Object o) {
        if (o == null) {
            // 如果传入的对象为空，则返回一个空字符串
            return "";
        }
        if (o instanceof String) {
            // 如果传入的对象是字符串类型，则将其返回
            return (String) o;
        }
        // 如果传入的对象不属于上述类型，则调用其toString()方法将其转为字符串后返回
        return o.toString().trim();

    }


    /**
     * 将传入的对象转换为float类型
     *
     * @param o 要转换的对象，可以是null、Float类型、String类型、BigDecimal类型
     * @return 转换后的float值，如果对象为null则返回0.0f
     */
    public static float toFloat(Object o) {
        if (o == null) {
            return 0f;
        } else if (o instanceof Float) {
            return (Float) o;
        } else if (o instanceof String) {
            return Float.valueOf((String) o);
        } else if (o instanceof BigDecimal) {
            return ((BigDecimal) o).floatValue();
        }
        return 0f;
    }


    public static Long toLong(Object o) {
        if (null == o) {
            return 0L;
        } else if (o instanceof Long) {
            return (Long) o;
        } else if (o instanceof String) {
            if ("".equals(o)) {
                return 0L;
            }
            return Long.valueOf((String) o);
        } else if (o instanceof BigDecimal) {
            return ((BigDecimal) o).longValue();
        }
        return 0L;
    }

    public static Integer toInteger(Object obj) {
        if (obj == null) {
            return 0;
        } else if (obj instanceof Long) {
            return ((Long) obj).intValue();
        } else if (obj instanceof BigDecimal) {
            return ((BigDecimal) obj).intValue();
        } else if (obj instanceof String) {
            String o = (String) obj;
            if ("".equals(o)) {
                return 0;
            } else {
                try {
                    return Integer.valueOf((String) obj);
                } catch (Exception e) {
                    return 0;
                }
            }
        } else if (obj instanceof Integer) {
            return (Integer) obj;
        }
        return 0;
    }

    public static List<?> toList(Object o) {
        if (o == null) {
            return null;
        } else if (o instanceof List) {
            return (List<?>) o;
        } else {
            return null;
        }
    }

    public static boolean isNull(Object o) {
        if (null == o) {
            return true;
        }
        if (o instanceof String) {
            return "".equals((String) o);
        }
        if (o instanceof Collection) {
            // 集合数量为0 则为空
            return ((Collection<?>) o).size() == 0;
        }
        return false;
    }

    public static String deleteLastChar(String input) {
        if (isNull(input))
            return "";
        return input.substring(0, input.length() - 1);

    }

    /**
     * 转换成  123,456,789的格式
     *
     * @param inputString
     * @param length
     * @return
     */
    public static String getListStr(String inputString, int length) {
        if (isNull(inputString))
            return "";
        String str = "";
        List<String> strList = getStrList(inputString, length);
        for (String string : strList) {
            str += string + ",";
        }
        return deleteLastChar(str);
    }

    /**
     * 把原始字符串分割成指定长度的字符串列表
     *
     * @param inputString 原始字符串
     * @param length      指定长度
     * @return
     */
    public static List<String> getStrList(String inputString, int length) {
        int size = inputString.length() / length;
        if (inputString.length() % length != 0) {
            size += 1;
        }
        return getStrList(inputString, length, size);
    }

    /**
     * 把原始字符串分割成指定长度的字符串列表
     *
     * @param inputString 原始字符串
     * @param length      指定长度
     * @param size        指定列表大小
     * @return
     */
    public static List<String> getStrList(String inputString, int length, int size) {
        List<String> list = new ArrayList<String>();
        for (int index = 0; index < size; index++) {
            String childStr = substring(inputString, index * length,
                    (index + 1) * length);
            list.add(childStr);
        }
        return list;
    }

    /**
     * 分割字符串，如果开始位置大于字符串长度，返回空
     *
     * @param str 原始字符串
     * @param f   开始位置
     * @param t   结束位置
     * @return
     */
    public static String substring(String str, int f, int t) {
        if (f > str.length())
            return null;
        if (t > str.length()) {
            return str.substring(f, str.length());
        } else {
            return str.substring(f, t);
        }
    }

    public static String getFixedLengthStr(String str, int length) {
        // 如果为空,返回全部都是0
        if (length < 1) {
            return "";
        }
        if (isNull(str)) {
            return getZeor(length);
        }
        if (str.length() < length) {
            return getZeor(length - str.length()) + str;
        }
        return str.substring(0, length);
    }

    public static String getZeor(int length) {
        String str = "";
        for (int i = 0; i < length; i++) {
            str += "0";
        }
        return str;
    }

    /*字符串MD5加密*/
    public static String stringToMD5(Object param) {
        if (param == null) {
            return "";
        } else {
            String result = null;
            MessageDigest md5 = null;
            try {
                md5 = MessageDigest.getInstance("MD5");
                byte[] input = str(param).getBytes(StandardCharsets.UTF_8);
                byte[] output = md5.digest(input);
                result = Hex.encodeHexString(output).toUpperCase();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return result;
        }
    }

    public static String getFileUrl(String param) {
        JSONObject jsonObj = JSONObject.parseObject(param);
        Object atts = JSON.toJSON(jsonObj.get("atts"));
        String fleUrl = "";
        if (atts instanceof JSONArray) {
            JSONArray attsArray = jsonObj.getJSONArray("atts");
            for (int m = 0; m < attsArray.size(); m++) {
                JSONObject attObj = attsArray.getJSONObject(m);
                fleUrl = str(attObj.get("fileUrl"));
            }
        }
        return fleUrl;
    }
}

